package com.misyi.designpattern.mediator;

import lombok.Data;

/**
 * 中介者模式
 *
 * @author licong
 * @date 2021-09-13 下午10:19
 */
public class MediatorPatternDemo {

    public static void main(String[] args) {
        Mediator mediator = new Mediator();
        ModuleA moduleA = new ModuleA(mediator);
        ModuleB moduleB = new ModuleB(mediator);
        ModuleC moduleC = new ModuleC(mediator);

        moduleA.execute();
        moduleB.execute();
        moduleC.execute();

        // 好处:
        // moduleA 只需要知道一个中介者就可以了, 具体的模块之间的交互逻辑封装在中介中
        // moduleB 同上
        // moduleC 同上
        // moduleA\B\C 之间不再有任何耦合, 不再有复杂关系, 相互之间修改不会对对方产生任何影响
    }

    @Data
    public static class Mediator {

        private ModuleA moduleA;
        private ModuleB moduleB;
        private ModuleC moduleC;

        public void moduleAInvoke() {
            moduleB.execute("中介者通知模块A");
            moduleC.execute("中介者通知模块A");
        }

        public void moduleBInvoke() {
            moduleB.execute("中介者通知模块B");
            moduleC.execute("中介者通知模块B");
        }

        public void moduleCInvoke() {
            moduleB.execute("中介者通知模块C");
            moduleC.execute("中介者通知模块C");
        }

    }


    public static class ModuleA {

        private Mediator mediator;

        public ModuleA(Mediator mediator) {
            this.mediator = mediator;
            this.mediator.setModuleA(this);
        }

        public void execute() {
            mediator.moduleAInvoke();
        }

        public void execute(String invoker) {
            System.out.println(invoker + "在调用模块A的功能");
        }
    }

    public static class ModuleB {

        private Mediator mediator;

        public ModuleB(Mediator mediator) {
            this.mediator = mediator;
            this.mediator.setModuleB(this);
        }

        public void execute() {
            mediator.moduleBInvoke();
        }

        public void execute(String invoker) {
            System.out.println(invoker + "在调用模块B的功能");
        }
    }

    public static class ModuleC {

        private Mediator mediator;

        public ModuleC(Mediator mediator) {
            this.mediator = mediator;
            this.mediator.setModuleC(this);
        }

        public void execute() {
            mediator.moduleCInvoke();
        }

        public void execute(String invoker) {
            System.out.println(invoker + "在调用模块C的功能");
        }
    }
}
